package com.bjsxt.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.Query;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bjsxt.constants.Constants;
import com.bjsxt.dto.UserDto;
import com.bjsxt.mapper.RoleMapper;
import com.bjsxt.utils.AppMd5Utils;
import com.bjsxt.vo.DataGridView;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.User;
import com.bjsxt.mapper.UserMapper;
import com.bjsxt.service.UserService;
@Service
public class UserServiceImpl  implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RoleMapper roleMapper;
    /**
     * 根据电话号码查询用户
     * @param phone
     * @return
     */
    @Override
    public User queryUserByPhone(String phone) {
        //条件构造器
        QueryWrapper<User> qw = new QueryWrapper<>();
        //根据电话号码查询用户
        qw.eq(User.COL_PHONE,phone);
        User user = userMapper.selectOne(qw);
        return user;
    }

    /**
     * 根据用户id查询用户信息
     * @param userId 用户编号
     * @return
     */
    @Override
    public User getOne(Long userId) {
        return userMapper.selectById(userId);
    }

    /**
     * 分页查询用户信息
     * @param userDto
     * @return
     */
    @Override
    public DataGridView listUserForPage(UserDto userDto) {
        Page<User> page = new Page<>(userDto.getPageNum(),userDto.getPageSize());
        QueryWrapper<User> qw = new QueryWrapper<>();
        // 根据用户名模糊查询
        qw.like(StringUtils.isNotBlank(userDto.getUserName()),User.COL_USER_NAME,userDto.getUserName());
        // 根据手机号模糊查询
        qw.like(StringUtils.isNotBlank(userDto.getPhone()),User.COL_PHONE,userDto.getPhone());
        // 根据状态进行查询
        qw.eq(StringUtils.isNotBlank(userDto.getStatus()),User.COL_STATUS,userDto.getStatus());
        // 根据部门id进行查询
        qw.eq(null!=userDto.getDeptId(),User.COL_DEPT_ID,userDto.getDeptId());
        // 查询用户创建时间在某个时间段的
        qw.ge(null!=userDto.getBeginTime(),User.COL_CREATE_TIME,userDto.getBeginTime());
        qw.le(null!=userDto.getEndTime(),User.COL_CREATE_TIME,userDto.getEndTime());
        // 根据用户id进行升序排列
        qw.orderByAsc(User.COL_USER_ID);
        userMapper.selectPage(page, qw);
        return new DataGridView(page.getTotal(),page.getRecords());
    }

    /**
     * 添加用户
     * @param userDto
     * @return
     */
    @Override
    public int addUser(UserDto userDto) {
        User user = new User();
        BeanUtil.copyProperties(userDto,user);
        // 设置创建人
        user.setCreateBy(userDto.getSimpleUser().getUserName());
        // 设置创建时间
        user.setCreateTime(DateUtil.date());
        // 设置创建用户的类型  1 普通用户
        user.setUserType(Constants.USER_NORMAL);
        // 截取用户的手机号  截取后6位
        String defaultPwd = user.getPhone().substring(5);
        // 设置盐
        user.setSalt(AppMd5Utils.createSalt());
        // 设置密码
        user.setPassword(AppMd5Utils.md5(defaultPwd,user.getSalt(),2));
        return userMapper.insert(user);
    }

    /**
     * 修改用户
     * @param userDto
     * @return
     */
    @Override
    public int updateUser(UserDto userDto) {
        User user = userMapper.selectById(userDto.getUserId());
        if (null==user){
            return 0;
        }
        BeanUtil.copyProperties(userDto,user);
        user.setUpdateBy(userDto.getSimpleUser().getUserName());
        return userMapper.updateById(user);
    }

    /**
     * 根据id删除用户
     * @param userIds
     * @return
     */
    @Override
    public int deleteUserByIds(Long[] userIds) {
        List<Long> ids = Arrays.asList(userIds);
        // 根据用户id删除 中间表sys_role_user里面的数据
        roleMapper.deleteRoleUserByUserIds(ids);
        // 删除用户表中的数据
        return userMapper.deleteBatchIds(ids);
    }

    /**
     * 查询所有可用的普通用户信息
     * @return
     */
    @Override
    public List<User> getAllUsers() {
        QueryWrapper<User> qw = new QueryWrapper<>();
        // 查询可用用户
        qw.eq(User.COL_STATUS,Constants.STATUS_TRUE);
        // 查询普通用户
        qw.eq(User.COL_USER_TYPE,Constants.USER_NORMAL);
        // 根据用户id排序
        qw.orderByAsc(User.COL_USER_ID);
        return userMapper.selectList(qw);
    }

    /**
     * 重置密码
     * @param userIds
     */
    @Override
    public void resetPassword(Long[] userIds) {
        for (Long userId : userIds) {
            // 根据用户id查询用户信息
            User user = userMapper.selectById(userId);
            // 创建变量默认密码 等一下还要进行加盐加密
            String defaultPwd = "";
            if (user.getUserType().equals(Constants.USER_ADMIN)){
                // 如果用户是超级管理员  那么初始密码为123456
                defaultPwd = "123456";
            }else {
                // 否则就是手机号后6位
                defaultPwd = user.getPhone().substring(5);
            }
            // 重新设置盐
            user.setSalt(AppMd5Utils.createSalt());
            // 重新设置密码
            user.setPassword(AppMd5Utils.md5(defaultPwd,user.getSalt(),2));
            // 修改用户信息
            userMapper.updateById(user);
        }
    }

    /**
     * 查询需要排班的医生信息
     * @param userId 医生id
     * @param deptId 科室id 如果科室id为空则表示查询全部科室的
     * @return
     */
    @Override
    public List<User> queryUsersNeedScheduling(Long userId, Long deptId) {
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.eq(null!=userId,User.COL_USER_ID,userId);// 根据id查询
        qw.eq(null!=deptId,User.COL_DEPT_ID,deptId);// 根据科室id查询
        qw.eq(User.COL_SCHEDULING_FLAG,Constants.SCHEDULING_FLAG_TRUE);// 查询需要排班的医生
        qw.eq(User.COL_STATUS,Constants.STATUS_TRUE); // 查询有效的
        return this.userMapper.selectList(qw);
    }
}
